home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 11 / Mac Magazin and MacEasy Magazine CD - Issue 11.iso / Sharewarebibliothek / Entwickler / WASTE 1.1b1 Distribution / WASTE Source / THINK specific / WELongCoords.c < prev    next >
Text File  |  1995-05-17  |  3KB  |  118 lines

  1. /*
  2.  *    WELongCoords.c
  3.  *
  4.  *    WASTE PROJECT
  5.  *    Utility Routines for dealing with 32-bit Coordinates
  6.  *
  7.  *    Copyright (c) 1993-1995 Marco Piovanelli
  8.  *    All Rights Reserved
  9.  *
  10.  */
  11.  
  12. enum {
  13.     kQDMin = -32767,
  14.     kQDMax = +32767
  15. };
  16.  
  17. typedef struct LongPoint {
  18.     long v;
  19.     long h;
  20. } LongPoint;
  21.  
  22. typedef struct LongRect {
  23.     long top;
  24.     long left;
  25.     long bottom;
  26.     long right;
  27. } LongRect;
  28.  
  29. pascal long _WEPinInRange(long value, long rangeStart, long rangeEnd);
  30. pascal void WELongPointToPoint(/* const */ LongPoint *lp, Point *p);
  31. pascal void WEPointToLongPoint(Point p, LongPoint *lp);
  32. pascal void WESetLongRect(LongRect *lr, long left, long top, long right, long bottom);
  33. pascal void WELongRectToRect(/* const */ LongRect *lr, Rect *r);
  34. pascal void WERectToLongRect(/* const */ Rect *r, LongRect *lr);
  35. pascal void WEOffsetLongRect(LongRect *lr, long hOffset, long vOffset);
  36. pascal Boolean WELongPointInLongRect(/* const */ LongPoint *lp, /* const */ LongRect *lr);
  37.  
  38. pascal long _WEPinInRange(long value, long rangeStart, long rangeEnd)
  39. {
  40.     asm {
  41.         movem.l rangeEnd, d0-d2    ; d0 = rangeEnd, d1 = rangeStart, d2 = value
  42.         cmp.l d0, d2            ; value > rangeEnd?
  43.         bgt.s @exit                ; yes, return rangeEnd
  44.         move.l d1, d0            ; 
  45.         cmp.l d0, d2            ; value < rangeStart?
  46.         blt.s @exit                ; yes, return rangeStart
  47.         move.l d2, d0            ; return value
  48. @exit
  49.     }
  50. }
  51.  
  52. pascal void WELongPointToPoint(register LongPoint *lp, register Point *p)
  53. {
  54.     p->v = (short) _WEPinInRange(lp->v, kQDMin, kQDMax);
  55.     p->h = (short) _WEPinInRange(lp->h, kQDMin, kQDMax);
  56. }
  57.  
  58. pascal void WEPointToLongPoint(Point p, register LongPoint *lp)
  59. {
  60.     lp->v = (long) p.v;
  61.     lp->h = (long) p.h;
  62. }
  63.  
  64. pascal void WESetLongRect(LongRect *lr, long left, long top, long right, long bottom)
  65. {
  66.     asm {
  67.         movea.l lr, a0
  68.         move.l top, (a0)+
  69.         move.l left, (a0)+
  70.         move.l bottom, (a0)+
  71.         move.l right, (a0)+
  72.     }
  73. }
  74.  
  75. pascal void WELongRectToRect(register LongRect *lr, register Rect *r)
  76. {
  77.     WELongPointToPoint((LongPoint *) lr, (Point *) r);
  78.     WELongPointToPoint((LongPoint *) lr + 1, (Point *) r + 1);
  79. }
  80.  
  81. pascal void WERectToLongRect(register Rect *r, register LongRect *lr)
  82. {
  83.     WEPointToLongPoint(*((Point *) r), (LongPoint *) lr);
  84.     WEPointToLongPoint(*((Point *) r + 1), (LongPoint *) lr + 1);
  85. }
  86.  
  87. pascal void WEOffsetLongRect(LongRect *lr, long hOffset, long vOffset)
  88. {
  89.     asm {
  90.         movea.l lr, a0
  91.         movem.l vOffset, d0/d1    ; d0 = vOffset, d1 = hOffset
  92.         add.l d0, (a0)+            ; lr->top += vOffset
  93.         add.l d1, (a0)+            ; lr->left += hOffset
  94.         add.l d0, (a0)+            ; lr->bottom += vOffset
  95.         add.l d1, (a0)+            ; lr->right += hOffset
  96.     }
  97. }
  98.  
  99. pascal Boolean WELongPointInLongRect(LongPoint *lp, LongRect *lr)
  100. {
  101.     asm {
  102.         moveq #0, d0            ; assume function result is FALSE
  103.         move.l lp, a0            ; 
  104.         movem.l (a0)+, d1/d2    ; d1 = lp.v, d2 = lp.h
  105.         move.l lr, a0            ; 
  106.         cmp.l (a0)+, d1            ; lp.v < lr.top ?
  107.         blt.s @exit                ; 
  108.         cmp.l (a0)+, d2            ; lp.h < lr.left ?
  109.         blt.s @exit                ; 
  110.         cmp.l (a0)+, d1            ; lp.v >= lr.bottom ?
  111.         bge.s @exit                ; 
  112.         cmp.l (a0)+, d2            ; lp.h >= lr.right ?
  113.         bge.s @exit                ; 
  114.         moveq #1, d0            ; set function result to TRUE
  115. @exit
  116.     }
  117. }
  118.